13-Java 的 类加载机制

DBUtil.class.getClassLoader().getResourceAsStream("config.properties") 能够找到配置文件,是因为 Java 的 类加载机制(ClassLoader) 会从 类路径(Classpath) 中查找资源文件。它的工作原理如下:


0.1.1. 1. ClassLoader 的作用

ClassLoader 是 Java 加载 .class 文件和资源文件(如 .properties.xml 等)的核心机制。它负责:


0.1.2. 2. getResourceAsStream() 如何查找文件?

getResourceAsStream(String name) 方法会在 类路径(Classpath) 中查找指定名称的资源文件,并返回一个 InputStream。它的查找逻辑如下:

(1) 查找范围

(2) 查找方式


0.1.3. 3. 为什么 FileReader 不能用相对路径,而 getResourceAsStream 可以?

方式 查找依据 适用场景 问题
FileReader("config.properties") 基于 当前工作目录(Working Directory) 本地文件系统 工作目录可能因运行方式(IDE、命令行、JAR)不同而变化,导致找不到文件
getResourceAsStream("config.properties") 基于 类路径(Classpath) JAR 包、IDE、服务器环境 稳定,只要文件在 Classpath 中就能找到

FileReader 的问题

getResourceAsStream 的优势


0.1.4. 4. 如何确保 config.properties 能被正确加载?

(1) 文件位置

(2) 代码加载方式

// 推荐方式:使用 ClassLoader
try (InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("config.properties")) {
    if (in == null) {
        throw new RuntimeException("配置文件 config.properties 未找到!");
    }
    Properties props = new Properties();
    props.load(in);
    // 读取配置...
} catch (IOException e) {
    throw new RuntimeException("加载配置文件失败", e);
}

0.1.5. 5. 总结

关键点 说明
ClassLoader 负责从 Classpath 加载 .class 和资源文件
getResourceAsStream() 从 Classpath 根目录查找文件,返回 InputStream
src/main/resources/ Maven/Gradle 项目的标准资源目录
FileReader 的问题 依赖工作目录,不可靠
getResourceAsStream 的优势 适用于 JAR、IDE、服务器环境,稳定可靠

这样,无论你的项目是在 IDE 中运行,还是打包成 JAR 文件,getResourceAsStream 都能正确找到 config.properties! 🚀